package ace.module.account.api;

import ace.cmp.core.model.PageDto;
import ace.cmp.core.model.PageResultDto;
import ace.cmp.core.model.R;
import ace.cmp.sdk.api.SdkApi;
import ace.module.account.api.model.dto.IamAccountDetailDto;
import ace.module.account.api.model.dto.IamAccountDto;
import ace.module.account.api.model.input.IamAccountCommonInfoOutInput;
import ace.module.account.api.model.input.IamAccountModifyStatusInput;
import ace.module.account.api.model.input.IamAccountSearchInput;
import ace.module.account.api.model.input.IamAccountSearchOutInput;
import ace.module.account.api.model.input.IamAccountWithProfileSearchInput;
import ace.module.account.api.model.input.RegisterQuickByPhoneInput;
import ace.module.account.api.model.input.RegisterQuickByUsernameInput;
import ace.module.account.api.model.input.RegisterQuickByUsernameOutInput;
import ace.module.account.api.model.input.RegisterQuickByWxMiniAppIdAndOpenIdInput;
import ace.module.account.api.model.input.register.RegisterQuickByPhoneOutInput;
import ace.module.common.api.model.input.PageInput;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;

/**
 * 账户api.
 *
 * @author Caspar
 */
public interface IamAccountApi extends SdkApi<IamAccountDto,Long> {

  /**
   * 账户名快递注册.
   *
   * @param input 注册资料
   * @return 账号id
   */
  R<Long> registerQuickByUsername(@Valid @NotNull RegisterQuickByUsernameInput input);

  /**
   * 账户名快递注册,根据外部应用键值.
   *
   * @param input 注册资料
   * @return 账户id
   */
  R<Long> registerQuickByUsernameAndAppOutInfo(
      @Valid @NotNull RegisterQuickByUsernameOutInput input);

  /**
   * 手机号码快速注册.
   *
   * @param input 注册资料
   * @return 账号id
   */
  R<Long> registerQuickByPhone(@Valid @NotNull RegisterQuickByPhoneInput input);

  /**
   * 手机号码快速注册
   *
   * @param input 注册资料
   * @return 账号id
   */
  R<Long> registerQuickByPhoneOutInput(@Valid @NotNull RegisterQuickByPhoneOutInput input);

  /**
   * 微信小程序openid快速注册.
   *
   * @param input 注册资料
   * @return 账号id
   */
  R<Long> registerQuickByWxMiniAppIdAndOpenId(
      @Valid @NotNull RegisterQuickByWxMiniAppIdAndOpenIdInput input);

  /**
   * 搜索账户与账户基础资料.
   *
   * @param input 搜索条件
   * @return 账户与账户资料
   */
  R<PageResultDto<IamAccountDetailDto>> pageWithProfile(
      @Valid @NotNull IamAccountWithProfileSearchInput input, @Valid @NotNull PageDto page);

  /**
   * 搜索账户与账户基础资料.
   *
   * @param input 搜索条件.
   * @return 账户与账户资料
   */
  R<PageResultDto<IamAccountDetailDto>> searchForDetail(
      @Valid @NotNull PageInput<IamAccountSearchInput> input);

  /**
   * 搜索账户与账户基础资料.
   *
   * @param input 搜索条件.
   * @return 账户与账户资料
   */
  R<PageResultDto<IamAccountDetailDto>> searchForDetailByOutInfo(
      @Valid @NotNull PageInput<IamAccountSearchOutInput> input);

  /**
   * 手机号码快速注册.
   *
   * @param input 账户基础资料
   * @return 账号id
   */
  R<Void> modifyCommonInfo(@Valid @NotNull IamAccountCommonInfoOutInput input);

  /**
   * 修改状态
   *
   * @param input 参数
   * @return code= 0 success
   */
  R<Void> modifyStatus(@Valid @NotNull IamAccountModifyStatusInput input);

}
